﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using CorreoSocialWeb.Models;

namespace CorreoSocialWeb.Views
{
    public abstract class FinalizadorDeEnvio
    {
        protected int RutaDeEnvioId { get; set; }
        protected bool Cancelando { get; set; }
        protected abstract bool EsDeMensajero { get; }

        protected RutaDeEnvio GetRuta()
        {
            return RutaDeEnvio.GetParaConfirmar(this.RutaDeEnvioId);
        }

        public string GetNombreDeUsuarioACalificar()
        {
            var ruta = this.GetRuta();

            var usuario = this.EsDeMensajero ? ruta.Remitente : ruta.Mensajero;

            return usuario.NombreDeUsuario;
        }

        public static FinalizadorDeEnvio Create(int rutaDeEnvioId, bool esMensajero, bool cancelando)
        { 
            FinalizadorDeEnvio item = null;

            if (esMensajero)
                item = new FinalizadorDeEnvioMensajero(rutaDeEnvioId, cancelando);
            else
                item = new FinalizadorDeEnvioRemitente(rutaDeEnvioId, cancelando);

            return item;
        }

        protected FinalizadorDeEnvio(int rutaDeEnvioId, bool cancelando)
        {
            this.RutaDeEnvioId = rutaDeEnvioId;
            this.Cancelando = cancelando;
        }

        public abstract string GetTitulo();

        public virtual void Finalizar(PuntajeDeCalificacion puntaje , string comentarios)
        {
            RutaDeEnvio.Finalizar(this.RutaDeEnvioId, this.EsDeMensajero, this.Cancelando, puntaje, comentarios);
        }
    }

    public class FinalizadorDeEnvioMensajero : FinalizadorDeEnvio
    {
        public FinalizadorDeEnvioMensajero(int rutaDeEnvioId, bool cancelando)
            : base(rutaDeEnvioId, cancelando)
        { }

        protected override bool EsDeMensajero
        {
            get { return true; }
        }

        public override string GetTitulo()
        {
            string mensaje = "(error)";

            RutaDeEnvio ruta = this.GetRuta();

            // mensajero
            // cancelando entrega
            // confirmando entrega
            if (this.Cancelando)
                mensaje = "Cancelar Envío Con Entrega Pendiente";
            else
                mensaje = "Confirmar Envío Entregado";

            return mensaje;
        }
    }

    public class FinalizadorDeEnvioRemitente : FinalizadorDeEnvio
    {
        public FinalizadorDeEnvioRemitente(int rutaDeEnvioId, bool cancelando)
            : base(rutaDeEnvioId, cancelando)
        { }

        public override string GetTitulo()
        {
            string mensaje = "(error)";
            // remitente 
            // cancelando entrega pendiente
            // cancelando despacho pendiente
            // confirmando entrega
            RutaDeEnvio ruta = this.GetRuta();

            if (this.Cancelando)
            { 
                if (ruta.Envio.EstadoEnu == EstadoDeEnvioEnu.DespachoPendiente)
                    mensaje = "Cancelar Envío Con Despacho Pendiente";
                else if (ruta.Envio.EstadoEnu == EstadoDeEnvioEnu.EnTransito)
                    mensaje = "Cancelar Envío en Tránsito";
            }
            else if (ruta.Envio.EstadoEnu == EstadoDeEnvioEnu.EnTransito)
                mensaje = "Confirmar Envío Recibido";

            return mensaje;
        }

        protected override bool EsDeMensajero
        {
            get { return false; }
        }
    }
}